[レポート] モバイル開発における AWS Lambda 活用法 #AWSSummit
モバイル開発における AWS Lambda 活用法
AWS Summit Tokyo 2015 Dev-08: Mobile の「モバイル開発における AWS Lambda 活用法」のレポートです。スピーカーはアマゾンデータサービスジャパン株式会社のソリューションアーキテクト、西谷氏です。
AWS Lambda 知っていますか?
そもそも AWS Lambda とは何なのか?について解説。
- サムネイルの生成やリサイズなどをイベントベースで実行。
- インフラの管理が不要。開発者はビジネスロジックに集中できます。
- オートスケール。スケールしても稼働した分だけの課金。
- Node.js で記述。/tmp の読み書きも可能。各種ライブラリも利用可能(一緒にアップロード)。
- 料金体系が細やか。100ミリ秒単位で課金。リクエスト単位で少額の課金。無料枠が非常に大きいので手軽に試せます。アイドル状態の場合は一切課金されません。
Lambda ファンクションの呼び出しは2種類
イベントの発生元となる AWS サービス
- S3
- Kinesis
- DynamoDB Stream (Preview)
- Cognito Event
- SNS
ユーザーアプリからの呼び出し
- カスタムイベント
- 各種 SDK を利用
モバイルバックエンドとしての AWS Lambda
AWS Mobile SDK によるサポート
モバイル向けの SDK でサポートしているので、ネイティブから呼び出すことが可能です。サーバー側で行わせたい処理を Web サーバーや API サーバーを立ち上げる必要なしにすぐに利用することが出来ます。インフラ管理ももちろん不要です。
AWS Mobile SDK
- 全サービス共通の認証機構
- オンライン・オフラインを自動ハンドリング
- クロスプラットフォーム
- Mobile OS への最適化
- モバイルに最適化されたクライアントライブラリ (DynamoDB OM など)
- メモリフットプリントの削減 (必要なサービスだけ利用可能)
呼び出し方は2種類
非同期実行
リクエストだけ可能。非同期で実行されるので、呼び出しが成功したかどうかのみレスポンスで帰ってきます。
同期実行
レスポンスが同期的に返って来ます。
ユースケース
写真共有モバイルアプリ
S3 へのアップロード、サムネ生成などをまとめて行いたい場合、Lambda を利用することで EC2 レスで実装可能です。
モーションセンサーを利用した観客参加型ゲーム
昨日、Developers Night でアトラクションとして実施したゲーム。Kinesis にレコードが入ってきたら Lambda ファンクションを起動し、DynamoDB に格納。最終的には Web ページで表示します。詳しくは以下から。
API サーバーの代わりとして
ユーザーによってコンテンツの出し分けをしたい場合、Lambda ファンクションで出し分けができます。
使い方
簡単です!また、モバイル経由で実行すると ClientContext というパラメータでクライアント情報を Lambda ファンクションで拾うことが出来ます。
- Lambda ファンクションを用意
- モバイルアプリから Invoke する
Lambda ファンクションを用意
今回はシンプルで「リクエストの名前を使って文字列を生成して返却する」という処理のサンプルです。
モバイルアプリから Invoke する (Android)
以下の手順で Invoke していきます。
- Lambda で実行した処理を interface として定義
- 各メソッドに @LambdaFanction アノテーションを付与
- リクエストパラメータはカスタムデータタイプクラスを実装(内部ではJSONとして自動でシリアライズ・デシリアライズ)
- LambdaInvokerFactory をインスタンス化 (Credential は Cognito で)
- Factory オブジェクトで Proxy オブジェクトを作成
- Lambda ファンクションを呼び出し (通信が発生するので非同期で実行すること)
例外は LambdaFunctionException を catch する必要があります。Credential のエラーなどはハンドリングできないので、AmazonServiceException などをハンドリングする必要もあります。
また、リクエストパラメータに関してカスタムデータバインダも定義可能です。これは独自のルールでシリアライズ・デシリアライズしたい場合に使います。その場合は LambdaDataBinder を実装します。
モバイルアプリから Invoke する (iOS)
iOS は Android よりシンプルです。ただし、iOS の場合はカスタムデータバインダは定義できません。
- AWSCognitoCredentialProvider のセットアップ (利用前に行っておく)
- AWSLambdaInvoker をインスタンス化
- invokeFunction: で呼び出し (同期呼び出し)
- パラメータで JSONObject が指定された場合、シリアライズされる
エラーハンドリングは2種類あって、Lambda の実行に失敗した場合は NSError が返り、Lambda ファンクションの実行に失敗した場合は AWSLambdaInvokerErrorDomain がドメインになります。
Lambda ファンクションの書き方
- JS で記述
- メモリ容量は 128MB がデフォルト
- タイムアウトはデフォルト3秒、最大60秒
- それぞれが隔離されたコンテナ内で実行される
基本
- Node.jsのベストプラクティスに従う (AWS SDK、ImageMagick は組み込み済み)
- ステートレス (永続化したい場合は S3、DynamoDB、または外部サービスを利用)
- プロセス、スレッド、/tmp、ソケット利用可能
- インバウンドのソケット接続は不可能
- 各種ライブラリを利用可能
登録
マネジメントコンソールから直接記述することも可能ですし、Zip ファイルをアップロードすることもできます。または S3 のオブジェクトを指定することも可能です。S3 を使う場合は簡易的なバージョニングも行うことが出来ます。
モニタリング
Lambda ファンクションの結果、実行回数などのメトリクスがダッシュボードで閲覧可能です。最大、最小、アベレージがリアルタイムにグラフ化されます。さらに CloudWatch と連携可能です(監視できるメトリクスは同様)。
デバッグ
まだまだ難しいところがあります。CloudWatch Logs の出力結果を見ていきます。実際に使ったメモリの使用量、時間、課金対象時間などが閲覧可能です。また、Lambda ファンクション内から console.log() でカスタムログも出力可能です。
聴講した感想
今年の夏に東京リージョンで利用できるようになる Lambda。モバイルアプリ開発では利用する機会が確実に増えてくると思われるので、今のうちから使い倒しておきましょう!!